# -*- encoding: utf-8 -*-
import requests
from lxml import etree
from time import sleep
from openpyxl import workbook
import re

url = "https://www.chinabidding.com/search/proj.htm"
# 创建excel对象
wb = workbook.Workbook()
ws = wb.active
ws.append(['标题', '招标项目编号', '招标日期', '项目概况', '项目名称', '项目实施地点', '设备名称', '数量', '简要技术规格', '网页链接', '所属行业'])


class Spider(object):

    def __init__(self):


        self.Name = input("请输入要查询的公司名称(例如：华虹半导体，请将公司名字输对)：")
        self.Xiang = input("请输入要查询的项目的数字(招标公告--0105，招标变更公告--0106，评标结果公示--0107，中标结果公示--0108)")
        self.payload = {
            'fullText': f"{self.Name}",
            'pubDate': '',
            'infoClassCodes': f"{self.Xiang}",
            'normIndustry': '',
            'zoneCode': '',
            'fundSourceCodes': '',
            'poClass': 'BidNotice',
            'rangeType': '',
            'currentPage': ''

        }
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
            'referer': 'https://www.chinabidding.com/search/proj.htm',
            'cookie': '__yjs_duid=1_f0abdf858ae3dfaf850adc425b857a641647931522280; JSESSIONID=50FB608C070BCAEEE5CC8DBDEED2EC82; Hm_lvt_3e8bc71035a13d1213b8be00baf17f95=1647931525,1647931678,1647931698,1647932340; Hm_lpvt_3e8bc71035a13d1213b8be00baf17f95=1647932551',
            'Content-Type': 'application/x-www-form-urlencoded'
        }

    def get_data_one(self, url):
        response = requests.post(url=url, headers=self.headers, data=self.payload)
        if response.status_code == 200:
            # print(response.status_code)
            print(response.text)
            return response.text

    def parse_main_page(self):
        for page in range(1, 100):
            print(f'----------------正在下载第{page}页---------------------')
            self.payload['currentPage'] = page
            html_one_text = etree.HTML(self.get_data_one(url))
            # 取出链接
            l_properties = html_one_text.xpath('//*[@id="lab-show"]/div[2]/div[2]/div/ul/li/a/@href')
            # 取出所属行业
            l_hanye = html_one_text.xpath(
                '//*[@id="lab-show"]/div[2]/div[2]/div/ul/li/a/div/dl/dd/span[1]/strong/text()')
            # 标题
            titles = html_one_text.xpath('//*[@id="lab-show"]/div[2]/div[2]/div/ul/li/a/h5/span/@title')
            # print(l_properties)
            # 进入每个链接并解析保存
            for i, hangye, tit in zip(l_properties, l_hanye, titles):
                try:
                    response = requests.get(url=i, headers=self.headers, data=self.payload)
                    # print(data.text)
                    # 判断是否为（2）======
                    str_number = ''.join(tit).split('公告')[1]
                    Number = re.findall(r'\d+', str_number)[0]
                    if Number != '2':
                        self.parse_data(response, i, hangye, tit)
                except:
                    print('没有（1）或（2）')
                    print(i)
                    print('=====' * 20)

    def parse_data(self, response, i, hangye, tit):
        html_data = response
        dt = etree.HTML(response.text)
        # 标题
        title = tit

        # '招标日期', '', '', '', ', '', ', '
        dt_time = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/p/span/text()')).split('发布时间：')[1]
        # 招标项目编号'
        dt_bianhao = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[7]')).split('招标项目编号:')[1]
        # 项目概况
        dt_gaikuang = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[8]')).split('招标项目名称:')[1]
        # 项目名称
        dt_mingcheng = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[8]')).split('招标项目名称:')[1]
        # 项目实施地点
        dt_didian = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[9]')).split('项目实施地点:')[1]
        # 网页链接
        dt_url = ''.join(i)
        # 所属行业'
        dt_hangye = hangye

        self.equipment_data(html_data, title, dt_bianhao, dt_time, dt_gaikuang, dt_mingcheng, dt_didian, dt_url,
                            dt_hangye)

        print('标题：%s' % title)
        print('招标日期：%s' % dt_time)
        print('招标项目编号：%s' % dt_bianhao)
        print('项目概况：%s' % dt_gaikuang)
        print('项目名称：%s' % dt_mingcheng)
        print('项目实施地点：%s' % dt_didian)
        print('网页链接：%s' % dt_url)
        print('所属行业: %s' % dt_hangye)
        print('====' * 20)

    def equipment_data(self, html_data, title, dt_bianhao, dt_time, dt_gaikuang, dt_mingcheng, dt_didian, dt_url,
                       dt_hangye):
        stp2 = html_data.text.split(r"<table width='400px' style='border-collapse: collapse;' border='1'>")[1].split(
            '</table>')[0]
        stp3 = stp2.replace('\n', '').replace('\t', '').replace(' ', '').replace('</tr>', '').replace('</td>', '')
        stp4 = stp3.split('<tr>')
        body = []  # 定义一个空列表，用来装每行字符串用
        # for循环，循环处理每行字符串
        for row in stp4:
            '''由于上一步的处理结果中第一行是空行，因此，这一步判断如果为非空行则继续进行处理'''
            if '<td>' in row:
                # 根据“<td>”分片
                td = row.split('<td>')
                # 往列表body中追加每行字符串
                body.append(td)
            else:
                print('========================')
        for kk in range(1, len(body)):
            # print(body[kk])
            name = body[kk][2]
            count = body[kk][3]
            Specifications = body[kk][4]
            self.save_data(title, dt_bianhao, dt_time, dt_gaikuang, dt_mingcheng, dt_didian, name, count,
                           Specifications,
                           dt_url, dt_hangye)
            print(f'设备名称：{name}=====数量：{count}========规格：{Specifications}')
            # print('======' * 10)
        # print(html_text)

    # 评标结果公示
    def parse_0107(self, data_text, i, l_hangye):
        dt = etree.HTML(data_text)
        # 标题
        dt_title = dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/h3/text()')
        # 时间
        dt_time = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/p/span/text()')).split('发布时间：')[1]
        # 项目名称
        dt_xiangmumingcheng = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[2]')).split('项目名称：')[1]
        # 招标项目编号
        dt_xiangmubianhao = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[2]')).split('招标项目编号：')[1]
        # 招标范围
        dt_fanwei = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[3]')).split('招标范围：')[1]
        # 招标机构
        dt_zhaobiaojigou = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[4]')).split('招标机构：')[1]
        # 招标人
        dt_zhaobiaoren = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[5]')).split('招标人：')[1]
        # 开标时间
        dt_kaibiao = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[6]')).split('开标时间：')[1]
        # 公示开始时间
        dt_kaishi = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[7]')).split('公示开始时间：')[1]
        # 评标公示截至时间
        dt_jiezhi = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[8]')).split('评标公示截至时间：')[1]
        # 中标候选人
        dt_houxuan = dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/table/tbody/tr[2]/td[2]/text()')
        # 制造商
        dt_zhizao = dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/table/tbody/tr[2]/td[3]/text()')
        # 网页链接
        dt_url = i
    def parse_0108(self, data_text, i, l_hangye):
        dt = etree.HTML(data_text)
        # 标题
        dt_title = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/h3/text()')).split('发布时间：')[1]
        # 时间
        dt_time = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/p/span/text()')).split('发布时间：')[1]
        # 项目名称
        dt_xiangmumingcheng = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[2]')).split('项目名称：')[1]
        # 招标项目编号
        dt_xiangmubianhao = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[2]')).split('项目编号：')[1]
        # 招标范围
        dt_fanwei = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[3]')).split('招标范围：')[1]
        # 招标机构
        dt_zhaobiaojigou = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[4]')).split('招标机构：')[1]
        # 招标人
        dt_zhaobiaoren = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[5]')).split('招标人：')[1]
        # 开标时间
        dt_kaibiao = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[6]')).split('开标时间：')[1]
        # 公示时间
        dt_kaishi = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[7]')).split('公示时间：')[1]
        # 评标公示截至时间
        dt_jiezhi = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[8]')).split('中标结果公示时间：')[1]
        # 中标人
        dt_zhongbiaoren = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[9]')).split('中标人：')[1]
        # 制造商
        dt_zhizao = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/table/tbody/tr[2]/td[3]/text()')).split('制造商：')[1]
        # 制造国家或地区
        dt_guojiadiqu = ''.join(dt.xpath('//*[@id="lab-show"]/div[2]/div[1]/div/div[2]/text()[11]')).split('制造国家或地区：')[1]
        # 所属行业
        dt_hangye = l_hangye

    def save_data(self, title, dt_bianhao, dt_time, dt_gaikuang, dt_mingcheng, dt_didian, name, count, Specifications,
                  dt_url,
                  dt_hangye):
        my_list = [title, dt_bianhao, dt_time, dt_gaikuang, dt_mingcheng, dt_didian, name, count, Specifications,
                   dt_url,
                   dt_hangye]  # 以列表形式写入数据
        ws.append(my_list)
        wb.save(filename="%s.xlsx" % self.Name)

    def run_chengxu(self):
        if self.Xiang == '0105':
            self.get_data_one(url)
            self.parse_main_page()
            self.parse_data()
            self.equipment_data()
            self.save_data()



if __name__ == '__main__':
    a = Spider()
    a.run_chengxu()
